package ar.edu.utn.frsf.tpae.a2012.g02.presentacion.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import ar.edu.utn.frsf.tpae.a2012.g02.models.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g02.models.MovimientoPago;
import ar.edu.utn.frsf.tpae.a2012.g02.presentacion.utiles.ServiceLocator;
import ar.edu.utn.frsf.tpae.a2012.g02.servicio.CuentaServicio;

/**
 * Bean utilizado para asociar elementos del modelo
 * con campos de la interfaz grafica de la pagina de realizar pagos.
 * {@code realizarPagos.jsp}
 *
 */
public class RealizarPagosBean implements Serializable {

	private static final long serialVersionUID = -2979756947473150568L;

	private List<SelectItem> cuentasItems;
	private MovimientoPago movPago;
	private long nroCuenta;
	private List<Cuenta> cuentas;

	public String cargarPagina() {
		nroCuenta = -1;
		movPago = new MovimientoPago();
		cuentasItems = new ArrayList<SelectItem>();
		FacesContext context = FacesContext.getCurrentInstance();
		ClienteBean clienteBean = (ClienteBean) context.getApplication().evaluateExpressionGet(context, "#{clienteBean}", ClienteBean.class);
		cuentas = clienteBean.getCliente().getCuentas();
		for (Cuenta c : cuentas) {
			cuentasItems.add(new SelectItem(c.getNroCuenta(), c.getSigla() + " - " + c.getNroCuenta()));
		}
		return "realizarPagos";
	}

	public String aceptar() {
		movPago.setFecha(new Date());
		Random cod = new Random();
		movPago.setCodigoPago("" + cod.nextInt());
		Cuenta cuentaDeMov = null;
		for (Cuenta c : cuentas) {
			if (c.getNroCuenta() == nroCuenta) {
				cuentaDeMov = c;
				movPago.setCuenta(c);
			
				break;
			}
		}
		if (validarMovimientoPago()) {
			movPago.getCuenta().setSaldoActual(movPago.getCuenta().getSaldoActual() - movPago.getMonto());
			cuentaDeMov.addMovimiento(movPago);
			CuentaServicio ctaServicio = ServiceLocator.getCuentaServicio();
			ctaServicio.altaCuenta(cuentaDeMov);
			return cargarPagina();
		}
		return null;
	}

	public String limpiar() {
		return cargarPagina();
	}

	private boolean validarMovimientoPago() {
		FacesContext context = FacesContext.getCurrentInstance();
		ResourceBundle bundle = ResourceBundle.getBundle("mensajes", context.getViewRoot().getLocale());
		boolean valido = true;
		if (nroCuenta == -1) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.cuentaInvalida"), ""));
			valido = false;
		}
		if (movPago.getMonto() <= 0) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.montoInvalido"), ""));
			valido = false;
		}
		if (movPago.getMonto() > movPago.getCuenta().getSaldoActual()) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.montoInsuficiente"), ""));
			valido = false;
		}
		if (movPago.getComentarioUsuario().isEmpty()) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.descripcionNula"), ""));
			valido = false;
		}
		if (movPago.getComentarioUsuario().length() > 50) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.descripcionInvalida"), ""));
			valido = false;
		}
		return valido;
	}

	public MovimientoPago getMovPago() {
		return movPago;
	}

	public void setMovPago(MovimientoPago movPago) {
		this.movPago = movPago;
	}

	public List<SelectItem> getCuentasItems() {
		return cuentasItems;
	}

	public void setCuentasItems(List<SelectItem> cuentasItems) {
		this.cuentasItems = cuentasItems;
	}

	public long getNroCuenta() {
		return nroCuenta;
	}

	public void setNroCuenta(long nroCuenta) {
		this.nroCuenta = nroCuenta;
	}

}
